home *** CD-ROM | disk | FTP | other *** search
/ MacFormat España 26 / macformat_26.iso / Shareware / Programación / C Reference Card / C Reference Card.rsrc / TEXT_408_8.txt < prev    next >
Text File  |  1997-01-29  |  6KB  |  181 lines

  1. CLASSES : defining, subclasses, methods, constructors, ...
  2. _________________________________________________________________________
  3.  
  4.  
  5. Classes are the building blocks of C++.  However, they are really nothing more than souped-up structures.  Data within a class is considered private unless specifically identified as public (or protected).  Private data is used only by member-functions within a class, otherwise known as methods.
  6.  
  7.  
  8. CLASS DEFINITION
  9.  
  10.   class Name:storage-specifier
  11.   {
  12.     private:
  13.       member-declarations
  14.     protected:
  15.       member-declarations
  16.     public:
  17.       member-declarations
  18.   };
  19.  
  20. Optional storage-specifier can be either direct or indirect.  Default access-specifier is private (by comparison, all data in a structure is public).
  21.  
  22.  
  23.  
  24. SUBCLASS DEFINITION
  25.  
  26. Subclasses inherit the functionality of the parent class.  If a method within the subclass has the same name as a method in the parent (or superclass), this method is said to override that of the superclass.
  27.  
  28.   class Name:access-specifier Superclass
  29.   {
  30.     private:
  31.       member-declarations
  32.     protected:
  33.       member-declarations
  34.     public:
  35.       member-declarations
  36.   };
  37.  
  38. The access-specifier can be either public or private (default).  If public, the public and protected members of the superclass are treated the same in the subclass.  If private, the public and protected members of the superclass are treated as private members of the subclass.
  39.  
  40.  
  41.  
  42. DEFINING METHODS
  43.  
  44. Methods are functions which use and manipulate data within a class, and perform functions based on that data.
  45.  
  46.   void className::methodName( arguments )
  47.   {
  48.     declarations
  49.     statements
  50.   }
  51.  
  52.  
  53.  
  54. CONSTRUCTORS AND DESTRUCTORS
  55.  
  56. Constructors and destructors allow you to initialized things when a new class is created, and clean-up house when your done.  When memory is allocated for a class (when using the 'new' keyword for example), a class constructor is automatically called.  A constructor has the same name as the class.  You can define multiple constructors for a class, but each one must have a unique set of arguments.  When a class variable goes out of scope, or is removed using the 'delete' keyword, the class destructor is called.
  57.  
  58.   class Name
  59.   {
  60.     public:
  61.       Name( int );      // Constructors have the same name as the class.
  62.       ~Name();          // Destructor name uses ~ (only one allowed).
  63.   };
  64.  
  65.   Name::Name()          // Constructor code.
  66.   {
  67.     declarations
  68.     statements
  69.   };
  70.  
  71.   Name::Name( int a )   // Constructor code.
  72.   {
  73.     declarations
  74.     statements
  75.   };
  76.  
  77.   Name::~Name()         // Destructor code (no arguments).
  78.   {
  79.     declarations
  80.     statements
  81.   };
  82.  
  83.  
  84.  
  85. VIRTUAL METHODS
  86.  
  87. You define virtual methods by preceding the declaration with the 'virtual' keyword.  Most base classes should use the 'virtual' keyword in front of all of it's member functions (or methods).
  88.  
  89.   virtual void myMethod1();      // virtual function
  90.   virtual void myMethod2() = 0;  // pure virtual function
  91.  
  92. You cannot define any objects for a class that contains a pure virtual function and the class is said to become an 'abstract' base class.
  93.  
  94.  
  95.  
  96. EXAMPLE USING CLASSES WITH VIRTUAL METHODS
  97.  
  98. The following snippet shows how to define classes, subclasses, and methods (member functions) within classes.  The important aspect of classes and C++ is that subclasses inherit (or override) the instance variables and methods of their parent or superclass (which in turn inherits the capabilities of it's superclass or... grandparent?).  Most base classes use the virtual keyword for method declarations to allow for 'cleaner' inheritance of class methods.  If your using pointers to objects (i.e., an array of objects), the compiler may not be able to resolve what type of object your sending a message to unless you use the virtual keyword in the base class.  Identifying methods as virtual adds some more house-keeping which the compiler must perform, but it assures that overrided methods are handled properly in all cases.
  99.  
  100.   // virtual.cp
  101.   #include <iostream.h>
  102.   #include<string.h>
  103.   
  104.   const int kFourWheelDrive = 1;
  105.   const int kTwoWheelDrive  = 0;
  106.   
  107.   class Vehicle
  108.   {
  109.       char *make;
  110.       int  year;
  111.     public:
  112.       Vehicle( char *m, int y );
  113.       ~Vehicle( void ) { delete make; }
  114.       virtual void print( void );
  115.   };
  116.   
  117.   Vehicle::Vehicle( char *m, int y )
  118.   {
  119.     make = new char[ strlen(m)+1];
  120.     strcpy( make, m );
  121.     year = y;
  122.   }
  123.   
  124.   void Vehicle::print( void )
  125.   {
  126.     cout << "Make: " << make << endl;
  127.     cout << "Year: " << year << endl;
  128.   }
  129.  
  130.   class Truck:public Vehicle
  131.   {
  132.       int id;
  133.     public:
  134.       Truck( int i, char *, int );
  135.       ~Truck( void ) { }
  136.       virtual void print( void );  // virtual keyword not needed, but
  137.                                    // is usually added for clarity.
  138.   };
  139.   
  140.   Truck::Truck( int i, char *m, int y ):Vehicle(m,y)
  141.   {
  142.     id = i;
  143.   }
  144.  
  145.   void Truck::print( void )
  146.   {
  147.     Vehicle::print();              // call Vehicle print method
  148.     cout << "Type: ";
  149.     if( id )
  150.       cout << "4x4" << endl;
  151.     else
  152.       cout << "4x2" << endl;
  153.   }
  154.  
  155.   void main( void )
  156.   {
  157.     Vehicle crx( "Honda", 1985 );
  158.     Truck   ranger( kFourWheelDrive, "Ford", 1993 );
  159.  
  160.     Vehicle *ptr[2];  // you can store pointers to Vehicle *or* Truck 
  161.                       // objects into this array (or pointers to *any*
  162.                       // sub-class of Vehicle for that matter).
  163.  
  164.     ptr[0] = &crx;
  165.     ptr[1] = &ranger;
  166.     
  167.     for( int counter = 0; counter < 2; counter++ )
  168.     {
  169.       // following statement requires virtual method!
  170.       ptr[counter]->print();
  171.       // in above statement, compiler doesn't know beforehand which
  172.       // print method to call.  Use of virtual keyword in base class
  173.       // allows compiler to determine this on-the-fly.
  174.  
  175.       cout << endl;
  176.       
  177.       // try deleting 'virtual' keyword in Vehicle class
  178.       // and see what happens.
  179.     }
  180.   }
  181.   // end virtual.cp